package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsDao;
import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.domain.SuccessCode;
import com.atguigu.jxc.entity.Goods;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.entity.Unit;
import com.atguigu.jxc.service.GoodsService;
import com.atguigu.jxc.util.PageResult;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @description
 */
@Service
public class GoodsServiceImpl implements GoodsService {

    @Autowired
    private GoodsDao goodsDao;

    @Autowired
    private GoodsTypeDao goodsTypeDao;

    @Override
    public ServiceVO getCode() {

        // 获取当前商品最大编码
        String code = goodsDao.getMaxCode();

        // 在现有编码上加1
        Integer intCode = Integer.parseInt(code) + 1;

        // 将编码重新格式化为4位数字符串形式
        String unitCode = intCode.toString();

        for(int i = 4;i > intCode.toString().length();i--){

            unitCode = "0"+unitCode;

        }
        return new ServiceVO<>(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS, unitCode);
    }
    // 分页查询商品库存信息
    @Override
    public Map<String, Object> getStockInfoPage(Integer page, Integer rows,String codeOrName,Integer goodsTypeId) {
        Map<String, Object> map = new HashMap<>();
        page = page == 0 ? 1 : page;
        int offSet = (page - 1) * rows;
        // 表示总记录数
        map.put("total", goodsDao.selectPageCount());
        // 当前页面展示的结果
        map.put("rows", goodsDao.selectByPage(offSet, rows,codeOrName,goodsTypeId));
        return map;
    }
    //  分页查询商品信息
    @Override
    public PageResult getGoodsInfoByPage(Integer page, Integer rows, String goodsName, Integer goodsTypeId) {
        PageHelper.startPage(page, rows);
        List<Goods> goodsList = goodsDao.selectGoodsByPage(goodsName,goodsTypeId);
        PageInfo<Goods> goodsPageInfo = new PageInfo<>(goodsList);
        return new PageResult(goodsPageInfo.getTotal(), goodsPageInfo.getList());
    }
    //  查询商品单位
    @Override
    public Map<String, Object> getGoodsUnit() {
        Map<String,Object> map = new HashMap<>();
        List<Unit> goodsUnitsList = goodsDao.getGoodsUnit();
        map.put("rows", goodsUnitsList);
        return map;
    }
    //  更新商品信息
    @Override
    public void updateGoods(Goods goods,Integer goodsId) {
        // 更新
        // update t_goods set goods_name=,inventory_quantity= where goods_id = null
        // 更新商品表 t_goods
        goodsDao.updateGoods(goods,goodsId);
//        // 根据 goods_type_id 更新商品分类表 t_goods_type
//        Integer goodsTypeId = goods.getGoodsTypeId();
//        goodsTypeDao.updateGoodsType(goodsTypeId,goods);
    }
    //  新增商品信息
    @Override
    public void insertGoods(Goods goods) {
        // insert into t_goods (goods_id) values(null,)
        goodsDao.insertGoods(goods);
    }

    @Override
    public int deleteGoodsInfoById(Integer goodsId) {
        // 判断商品状态,有入库、有进货和销售单据的不能删除
        Goods goodsInfo = goodsDao.selectGoodsById(goodsId);
        Integer state = goodsInfo.getState();
        if (state==0){
            //可以删除
            goodsDao.deleteGoodsInfoById(goodsId);
            return 1;
        }else {
            return 0;
        }
    }
    //  分页查询无库存商品信息
    @Override
    public PageInfo<Goods> getNoInventoryByPage(Integer page, Integer rows, String nameOrCode) {
        PageHelper.startPage(page, rows);
        List<Goods> noInventoryList = goodsDao.selectNoInventoryByPage(nameOrCode);
        PageInfo<Goods> goodsPageInfo = new PageInfo<>(noInventoryList);
        return goodsPageInfo;
    }
    //  分页查询有库存商品信息
    @Override
    public PageInfo<Goods> getHasInventoryByPage(Integer page, Integer rows, String nameOrCode) {
        PageHelper.startPage(page, rows);
        List<Goods> hasInventoryList = goodsDao.selectHasInventoryByPage(nameOrCode);
        PageInfo<Goods> goodsPageInfo = new PageInfo<>(hasInventoryList);
        return goodsPageInfo;
    }
    // 添加商品期初库存
    @Override
    public void updateGoodsStock(Integer goodsId, Integer inventoryQuantity, double purchasingPrice) {
        goodsDao.updateGoodsStock(goodsId,inventoryQuantity,purchasingPrice);
    }
    //  删除商品信息
    @Override
    public int deleteGoodsStock(Integer goodsId) {
        // 判断商品状态,有入库、有进货和销售单据的不能删除
        Goods goodsInfo = goodsDao.selectGoodsById(goodsId);
        Integer state = goodsInfo.getState();
        if (state==0){
            //可以删除
            goodsDao.deleteGoodsStock(goodsId);
            return 1;
        }else {
            return 0;
        }
    }
    //  查询库存报警商品信息
    @Override
    public Map<String, Object> getListAlarm() {
        Map<String, Object> map = new HashMap<>();
        List<Goods> goodsListAlarm = goodsDao.selectGoodsListAlarm();
        map.put("rows",goodsListAlarm);
        return map;
    }
    // 打开商品类别选择树
//    @Override
//    public List<GoodsType> getGoodsType() {
//        // 声明一个集合用于封装
//        ArrayList<Object> list = new ArrayList<>();
//        //1、查出所有分类
//        List<GoodsType> goodsTypeList = goodsDao.selectGoodsType();
//        //  分组：先按照一级分类Id 进行分组！
//        Map<Long, List<GoodsType>> baseCategory1Map = new HashMap<>();
//        // 先查出1级数据 map key 一级数据id  value 一级数据List
////        baseCategory1Map.put("pId1", goodsTypeList);
//        // 再查2级数据
//        // 封装
//        return null;
//    }


}
